/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.AplicacionVacunaFisica;
import fisica.CapaFisica;
import hibernate.objeto.AplicacionVacuna;
import hibernate.objeto.NombreComercialMedicamento;
import hibernate.objeto.Paciente;
import hibernate.objeto.PeriodoAplicacionVacuna;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Vector;
import presentacion.CapaPresentacion;

/**
 *
 * @author Gonzalo
 */
public class AplicacionVacunaLogica extends CapaLogica{

    /**
     * Agrega/modifica la Aplicación a la base de datos.
     *
     * @param datosAplicacion Los datos a cargar dentro del objeto
     * @param nombreVacuna El nombre de la vacuna
     * @param unPaciente El paciente al cual asociar la aplicacion
     * @param aplicacionVacunaAModificar La aplicación de la vacuna a
     * crear/modificar
     * @param idObjetoCreado El id del objeto a agregar
     *
     * @return true si se agregó/modificó correctamente, false en caso contrario
     */
    public static boolean agregarOModificarAplicacion(Object[] datosAplicacion,
            String nombreVacuna,
            Paciente unPaciente, 
            AplicacionVacuna aplicacionVacuna, 
            int[] idObjetoCreado) {

            //Si es una modificacion
            if (idObjetoCreado[0] != -1) {
                //Escribe el log
                backUpModificacion(idObjetoCreado[0]);
            }
        
        aplicacionVacuna = crearObjetoAplicacionVacuna(datosAplicacion,
                nombreVacuna, unPaciente, aplicacionVacuna);

        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(aplicacionVacuna)) {
            idObjetoCreado[0] = aplicacionVacuna.getIdAplicacionVacuna();
            return true;
        } else {
            return false;
        }
    }


    /**
     * Crea un objeto AplicacionVacuna con los datos pasados por parámetro.
     *
     * @param datosAplicacion Los datos de la aplicacion a crear
     * @param aplicacionVacuna   La aplicacion de la vacuna a crear
     * @return El objeto AplicacionVacuna recién creado
     */
    private static AplicacionVacuna crearObjetoAplicacionVacuna(
            Object[] datosAplicacion, String nombreVacuna,
            Paciente unPaciente, AplicacionVacuna aplicacionVacuna) {

        if (aplicacionVacuna == null) {
            aplicacionVacuna = new AplicacionVacuna();
        }

        PeriodoAplicacionVacuna periodoAplicacionVacuna;
        periodoAplicacionVacuna = PeriodoAplicacionVacunaLogica
                .getPeriodoAplicacionVacunaPorNombrePeriodoAplicacionYNombreVacuna(
                datosAplicacion[CapaLogica.APLICACIÓN_VACUNA_PERIODO_APLICACION]
                .toString(), nombreVacuna);
        aplicacionVacuna.setFechaPeriodoAplicacionVacuna(
                (Date) datosAplicacion[CapaLogica.APLICACIÓN_VACUNA_FECHA]);
        if ((Boolean)datosAplicacion[CapaLogica.APLICACIÓN_VACUNA_ES_ANTECEDENTE]) {
            aplicacionVacuna.setEsAntecedenteAplicacionVacuna(
                    "si");
        } else {
            aplicacionVacuna.setEsAntecedenteAplicacionVacuna(
                    "no");
        }
        aplicacionVacuna.setNombreComercialMedicamento(
                (NombreComercialMedicamento) datosAplicacion[
                CapaLogica.APLICACIÓN_VACUNA_NOMBRE_MEDICAMENTO]);
        aplicacionVacuna.setLoteAplicacionVacuna(
                datosAplicacion[CapaLogica.APLICACIÓN_VACUNA_LOTE].toString());
        aplicacionVacuna.setPartidaAplicacionVacuna(
                datosAplicacion[CapaLogica.APLICACIÓN_VACUNA_PARTIDA].toString());
        aplicacionVacuna.setAnioVencimientoAplicacionVacuna(
                Integer.valueOf(datosAplicacion[CapaLogica.APLICACIÓN_VACUNA_ANIO]
                .toString()).intValue());
        aplicacionVacuna.setMesVencimientoAplicacionVacuna(
                datosAplicacion[CapaLogica.APLICACIÓN_VACUNA_MES].toString());

        aplicacionVacuna.setPeriodoAplicacionVacuna(
                periodoAplicacionVacuna);
        aplicacionVacuna.setPaciente(unPaciente);
        aplicacionVacuna.setEnBdAplicacionVacuna(true);
        return aplicacionVacuna;
    }   

    /**
     * Retorna el objeto AplicacionVacuna según el id.
     *
     * @param id El id de la aplicacion de la vacuna
     * @return El objeto AplicacionVacuna consultado, null si no existe
     */
    public static AplicacionVacuna getAplicacionVacunaPorIdEnBd(int id){
        return AplicacionVacunaFisica.getAplicacionVacunaPorIdYPorEnBd(id, true);
    }

    /**
     * Retorna el objeto AplicacionVacuna según el nombre de la vacuna, el
     * id de paciente y el período de aplicación
     * @param nombreVacuna Nombre de la vacuna aplicada
     * @param idPaciente El id del paciente
     * @param periodoAplicacion El período de aplicación
     * @param estado false si es baja lógica, true si aún activo
     * @return El objeto AplicacionVacuna consultado
     */
    public static AplicacionVacuna
            getAplicacionVacunaPorNombreVacunaPorNombrePeriodoAplicacionPorIdPacienteYPorEnBd(
            String periodoAplicacion, int idPaciente, String nombreVacuna,
             boolean estado) {
        return AplicacionVacunaFisica.
                getAplicacionVacunaPorNombreVacunaPorNombrePeriodoAplicacionPorIdPacienteYPorEnBd(
                reemplazarUnApostrofoPorDosApostrofos(periodoAplicacion),
                reemplazarUnApostrofoPorDosApostrofos(nombreVacuna),
                idPaciente, estado);
    }

    /**
     * Retorna el objeto AplicacionVacuna según el id del período de aplicación
     * @param idPeriodoAplicacion El id del período aplicación
     * @param estado false si es baja lógica, true si aún activo
     * @return El objeto AplicacionVacuna consultado
     */
    public static AplicacionVacuna
            getAplicacionVacunaPorIdPeriodoAplicacionYPorEnBd(
            int idPeriodoAplicacion, boolean estado) {
        return AplicacionVacunaFisica.getAplicacionVacunaPorIdPeriodoAplicacionYEnBd(
                idPeriodoAplicacion, estado);
    }


    /**
     * Retorna el vector AplicacionVacuna según el nombre de la vacuna y el
     * id de paciente
     * @param nombreVacuna Nombre de la vacuna aplicada
     * @param idPaciente El id del paciente
     * @param estado false si es baja lógica, true si aún activo
     * @return El objeto AplicacionVacuna consultado
     */
    public static Vector<AplicacionVacuna>
            getVectorAplicacionVacunaPorNombreVacunaYPorIdPacienteYPorEnBd (
            String nombreVacuna, int idPaciente, boolean estado) {
        return AplicacionVacunaFisica
                .getVectorAplicacionVacunaPorNombreVacunaYPorIdPacienteYEnBd(
                reemplazarUnApostrofoPorDosApostrofos(
                nombreVacuna), idPaciente, estado);
    }

    /**
     * Retorna el vector AplicacionVacuna según el
     * id de paciente
     *
     * @param idPaciente El id del paciente
     * @return El objeto AplicacionVacuna consultado
     */
    public static Vector<AplicacionVacuna> getVectorAplicacionVacunaPorIdPaciente (
            int idPaciente) {
        return AplicacionVacunaFisica.getVectorAplicacionVacunaPorIdPaciente(
                idPaciente);
    }

    /**
     * Elimina lógicamente una aplicación de la base de datos.
     *
     * @param aplicacionVacuna  La aplicación recibida
     * @return true si se eliminó correctamente false en caso contrario
     */
    public static boolean eliminarAplicacionVacuna(AplicacionVacuna
            aplicacionVacuna) {
        //Setea inactivo
        aplicacionVacuna.setEnBdAplicacionVacuna(false);

        //Guarda en la base de datos
        return AplicacionVacunaFisica.guardarOActualizarObjeto(
                 aplicacionVacuna);
    }

    /**
     * Determina si una aplicación de una vacuna es única.
     *
     * @param vacuna El nombre del objeto Vacuna
     * @param periodoAplicacionVacuna  El nombre del objeto PeriodoAplicacionVacuna
     * @param idPaciente El id del objeto paciente
     *
     * @return True si es unica, False en caso contrario
     */
    public static boolean esUnica(String vacuna, String periodoAplicacionVacuna,
            int idPaciente) {
            if (getAplicacionVacunaPorNombreVacunaPorNombrePeriodoAplicacionPorIdPacienteYPorEnBd(
                    periodoAplicacionVacuna, idPaciente, vacuna, true) == null) {
                return true;
            } else {
                if (periodoAplicacionVacuna.equalsIgnoreCase("Cada diez Años")) {
                    return true;
                } else {
                    return false;
            }
        }
        
    }

    /**
     * Escribe un archivo de texto el cual es una imagen del objeto que se
     * ha modificado y sus objetos asociados, guardando el mismo en la tabla.
     *
     * @param idObjeto El id del objeto a resguardar
     */
    private static void backUpModificacion(int idObjeto) {
        String rutaLogLocal = DIRECTORIO_DE_TRABAJO + "\\" +
                    AplicacionVacuna.class.getName() + ".txt";
        //Se recupera el objeto para recupera el archivo
        AplicacionVacuna aplicacionVacuna =
                AplicacionVacunaLogica.
                getAplicacionVacunaPorIdEnBd(idObjeto);
        File log = CapaLogica.byteArrayToFile(rutaLogLocal,
                aplicacionVacuna.getArchivoLogAplicacionVacuna());

        if (log == null) {
            log = new File(rutaLogLocal);
        }

        //Se manipula el log
        escribirLogAplicacionVacuna(aplicacionVacuna, rutaLogLocal);

        //Se guarda
        byte[] bFile = new byte[(int) log.length()];

        try {
            FileInputStream fileInputStream = new FileInputStream(log);
            //convert file into array of bytes
            fileInputStream.read(bFile);
            fileInputStream.close();
        } catch (Exception exc) {
            System.err.println(exc.getMessage());
        }

        //Setea el adjunto
        aplicacionVacuna.setArchivoLogAplicacionVacuna(bFile);
        eliminarArchivosTemporales();
    }

    /**
     * Escribe el objeto en un archivo.
     *
     * @param aplicacionVacuna  El objeto a resguardar
     * @param log El archivo en donde escribir
     * @return true si se escribio correctamente, false en caso contrario
     */
    public static boolean escribirLogAplicacionVacuna(
            AplicacionVacuna aplicacionVacuna, String rutaLog) {
        try {
            //ExamenComplementario
            String examenComplementarioString = getAplicacionVacunaString(
                    aplicacionVacuna);

            BufferedWriter bw = new BufferedWriter(new FileWriter(rutaLog, true));
            examenComplementarioString += "\n" + SEPARADOR + "\n";
            //Escribe los datos del objeto
            bw.write(examenComplementarioString);

            bw.close();
        } catch (IOException exception) {
            System.err.println(exception.getMessage());
            return false;
        }

        return true;
    }

    /**
     * Retorna el texto String correspondiente a la descripcion de la
     * AplicacionVacuna.
     *
     * @param aplicacionVacuna  La AplicacionVacuna
     * @return El String que contiene el String
     */
    public static String getAplicacionVacunaString(
            AplicacionVacuna aplicacionVacuna) {
        
        String aplicacionVacunaAmbulatorioString =
                    "idAplicacionVacuna: " +
                    aplicacionVacuna.getIdAplicacionVacuna() + "\n" +
                    "nombreComercialMedicamento: " +
                    aplicacionVacuna.getNombreComercialMedicamento().
                    getNombreNombreComercialMedicamento() + "\n" +
                    "nombreVacuna: " +
                    aplicacionVacuna.getPeriodoAplicacionVacuna().
                    getVacuna().getNombreVacuna() + "\n" +
                    "periodoAplicacionVacuna: " +
                    aplicacionVacuna.getPeriodoAplicacionVacuna().
                    getDescripcionPeriodoAplicacionVacuna() + "\n" +
                    "idPaciente: " +
                    aplicacionVacuna.getPaciente().getIdPaciente() + "\n" +
                    "esAntecedenteAplicacionVacuna: " +
                    aplicacionVacuna.getEsAntecedenteAplicacionVacuna() + "\n" +
                    "loteAplicacionVacuna: " +
                    aplicacionVacuna.getLoteAplicacionVacuna() + "\n" +
                    "partidaAplicacionVacuna: " +
                    aplicacionVacuna.getPartidaAplicacionVacuna() + "\n" +
                    "fechaPeriodoAplicacionVacuna: " +
                    aplicacionVacuna.getFechaPeriodoAplicacionVacuna() + "\n" +
                    "anioVencimientoAplicacionVacuna: " +
                    aplicacionVacuna.getAnioVencimientoAplicacionVacuna() + "\n" +
                    "mesVencimientoAplicacionVacuna: " +
                    aplicacionVacuna.getMesVencimientoAplicacionVacuna() + "\n";

        return aplicacionVacunaAmbulatorioString;
    }    


    /**
     * Retorna el texto HTML correspondiente a la descripcion de la
     * AplicacionVacuna.
     *
     * @param aplicacionVacuna  La AplicacionVacuna
     * @return El HTML que contiene el String
     */
    public static String getAplicacionVacunaHTML(
            AplicacionVacuna aplicacionVacuna) {
        String aplicacionVacunaHTML = "";

        if (aplicacionVacuna != null) {
        aplicacionVacunaHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">APLICACIÓN VACUNA</font><br><br> "
                    + "<hr /><font size=\"3\" face=\"arial\" color=\"blue\">Fecha: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    CapaPresentacion.imprimirFecha(aplicacionVacuna.
                    getFechaPeriodoAplicacionVacuna()) + "</font><br><hr /><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Nombre de la vacuna: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    aplicacionVacuna.getPeriodoAplicacionVacuna().
                    getVacuna().getNombreVacuna() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Nombre comercial del medicamento: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    aplicacionVacuna.getNombreComercialMedicamento().
                    getNombreNombreComercialMedicamento() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Período: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    aplicacionVacuna.getPeriodoAplicacionVacuna().
                    getDescripcionPeriodoAplicacionVacuna() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Es antecedente: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    aplicacionVacuna.getEsAntecedenteAplicacionVacuna() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Lote: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    aplicacionVacuna.getLoteAplicacionVacuna() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Partida: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    aplicacionVacuna.getPartidaAplicacionVacuna() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Vencimiento: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    aplicacionVacuna.getAnioVencimientoAplicacionVacuna() + " - " +
                    aplicacionVacuna.getMesVencimientoAplicacionVacuna() + "</font><br><br>";

                return aplicacionVacunaHTML;
        } else {
            aplicacionVacunaHTML = "<font size=\"3\" face=\"arial\" color=\"blue\">APLICACIÓN VACUNA</font><br><br> " +
                    "<hr /><font size=\"3\" face=\"arial\">No posee</font><br></font><hr />";
        }

        return aplicacionVacunaHTML;
    }

}
